/**
 * roundFractional 浮点运算精度解决函数
 *
 * @param x {Number} 浮点数
 * @param n {Number} 想要保留的位数
 * @returns {Number}
 */
function roundFractional(x,n){
  return Math.round(x * Math.pow(10, n)) / Math.pow(10, n);
}

/**
 * numDecimalPlaces 计算小数点位数
 * 
 * @param x {Number} 输入的数字
 * @returns {Number}
 */
function numDecimalPlaces(x){
  return x.toString().split('.')[1] ? x.toString().split(".")[1].length : 0;
}

/**
 * validate 表单校验
 *
 * @param input 输入的数字
 * @param output 输出的错误提示
 * @returns {Boolean} 
 */
function validate(input, output){
  // 数据不能为空
  if(input.val() === ''){
    output.html('该字段输入不能为空');
    return false;
  } else {
    output.html('')
  }

  // 数据类型不对，数据不能是字符串，而应该是数字
  let inputval = Number(input.val());

  if(isNaN(inputval)){
    output.html('该字段输入应该为数字');
    return false;
  }else {
    output.html('')
  }

  // 数据的取值范围错误，宽度和高度都应该大于零
  if(inputval <= 0){
    output.html('该数值不能小于等于0');
    return false;
  } else {
    output.html('');
  }

  return true; 
}


/**
 * fieldValidate 字段级检验
 *
 * @param input 输入的数值
 * @param output 输出的错误提示信息
 * @returns {Boolean}
 */
function fieldValidate(input, output){
  // 数据不能为空
  if(input === ''){
    output.html('该字段输入不能为空');
    return false;       
  } else {
    output.html('')        
  }

  //数据类型不对，数据不能是字符串，而应该是数字
  if(isNaN(input)){
    output.html('该字段输入应该为数字');
    return false;        
  }else {
    output.html('')      
  }
  
  // 数据的取值范围错误，宽度和高度都应该大于零
  if(input <= 0){
    output.html('该数值不能小于等于0');
    return false;      
  } else {
    output.html('');    
  }

  return true; 
}


$(()=>{
  //get dom elem
  let $width=$('#width'),
      $btncal = $('#calc'),
      $height = $('#height'),
      $perimeter = $('#perimeter'),
      $area = $('#area'),
      $widthval = $('#width-val'),
      $heightval = $('#height-val'),
      $form = $('#main');
  
  $forkMeGH.show("https://gitee.com/jiyujia/rectangular")

  //字符级校验
  $form.keypress((e)=>{
    let key = e.key,
        val = e.target.value;
        pos = e.target.selectionStart;
    console.log('key=',key);
    console.log('val=',val);
    console.log('pos=',pos);
    console.log('----------');

    if(/[abcdf-zABCDF-Z`~!@#$%^&*()=_+[\]{}|;:'",<>/?\\]/.test(key)) e.preventDefault();

    //检验.
    if(key=='.'){
      //已经有了.就不能再加
      if(val.indexOf('.')!=-1) e.preventDefault();
      //第一个输入不能是小数点
      if(!val) e.preventDefault();
      //e之后不能是小数点
      if(pos > 0 && /[-eE]/.test(val.slice(0, pos))) e.preventDefault();
     
    }
    //检验e、E
    if(key=='e'||key=='E'){
      //不能在首位
      if(!val) e.preventDefault();
      //已经有了就不能出现第二个
      if(val.indexOf('e')!=-1||val.indexOf('E')!=-1) e.preventDefault();
      //.-后不能跟e
      if (pos > 0 && /[-.]/.test(val.slice(pos-1, pos))) e.preventDefault();
      //后不能加小数点
      if (val.slice(pos, val.length).indexOf(".")!=-1) e.preventDefault();
    }
    //检验-
    if(key == '-'){
      //第一位为-
      if(!val) e.preventDefault();
      if(pos > 0 && /[0-9.]/.test(val.slice(pos - 1, pos))) e.preventDefault();
      if(pos > 0 && val.indexOf("-")!=-1) e.preventDefault();
    } 
  })

  //字段级检验
  $form.focusout((e)=>{
    if(e.target.value!='计算'){
      if(!fieldValidate(e.target.value, $(`#${e.target.id}-val`))){
        $(`#${e.target.id}`).select();
      }
    }
  })

  
  //字段检验(基本方法)
 /* 
  $width.focusout(()=>{
    console.log($width.val());
    console.log($widthval);
    if (!validate($width, $widthval)){
      $width.select();
    }
  });

  $height.focusout(()=>{
    if (!validate($height, $heightval)){
      $height.select();
    }
  });
  */


  //cale button click
  $btncal.click(()=>{
    //get value
    let w = Number($width.val());
    let h = Number($height.val());

    // validate height $$ width 
    let n1 = numDecimalPlaces(w),
        n2 = numDecimalPlaces(h);

    //validate 表单级检验
    if(validate($width, $widthval) && validate($height, $heightval)){
      //cale
      let p = roundFractional((w + h) * 2, n1 > n2 ? n1 : n2) ,
          a = roundFractional(w * h, n1 + n2);

      //output
      $perimeter.val(p);
      $area.val(a)
    }
  })
})


